package com.kaifamiao.methods;

public class Prime {

    /**
     * 判断一个整数是否是质数
     * @param integer 表示被检查的整数
     * @return 当被检查整数是质数时返回true,否则返回false
     */
    public boolean isPrime(int integer) {
        // 若 参数 小于等于 1 则返回 false (即integer不是质数)
        if( integer <= 1 ){
            return false;
        }

        // 求 integer 的平方根
        double squareRoot = Math.sqrt(integer);
        for( int i = 2 ; i <= squareRoot ; i++ ){
            // 若 integer 能够被 [2, squareRoot]之间的自然数整除则直接返回 false
            if( integer % i == 0 ){
                return false;
            }
        }

        // 经过前面检查，没有查出integer不是质数，则返回 true
        return true;
    }

    /**
     * 打印不大于bound的所有质数
     * @param bound 表示被打印质数所在的范围
     */
    public void show(int bound){
        for( int i = 2 , count = 1 ; i <= bound; i++ ) {
            // 调用本类中定义的用来判断整数是否是质数的方法
            boolean result = this.isPrime( i );
            // 若 i 是个质数
            if( result ) {
                System.out.printf("%d\t", i);
                if( count % 10 == 0 ) {
                    System.out.println();
                }
                count++;
            }
            if( i == bound && count % 10 != 0 ) {
                System.out.println();
            }
        }
    }

    /**
     * 打印从2开始的amount个质数
     * @param amount 表示被打印质数的个数
     */
    public void display(int amount){
        if( amount <= 0 ) {
            System.out.println( "非法参数" );
            return;
        }
        for( int count = 1, i = 2 ; count <= amount ; i++){
            if( this.isPrime( i ) ){
                System.out.printf("%d\t", i);
                if( count % 10 == 0 ) {
                    System.out.println();
                }
                count++;
            }
        }
    }

    public static void main(String[] args) {
        Prime p = new Prime();
        p.isPrime( 4 );
        System.out.println( "- ".repeat( 15 ) );
        p.show( 100 );
        System.out.println( "- ".repeat( 15 ) );
        p.display(50);
    }

}
